package ast

import "bytes"

type Node interface {
	TokenLiteral() string
	//调试用
	StringTree() string
}

// 语句
type Statement interface {
	Node
	statementNode()
}

// 表达式节点
// 定义一个Expression接口，该接口包含Node接口和expressionNode方法
type Expression interface {
	Node
	expressionNode()
}

// 根节点
type Program struct {
	Statements []Statement
}

// TokenLiteral 方法返回 Program 结构体的第一个语句的 TokenLiteral
func (p *Program) TokenLiteral() string {
	// 如果 Program 结构体的 Statements 切片长度大于 0，则返回第一个语句的 TokenLiteral
	if len(p.Statements) > 0 {
		return p.Statements[0].TokenLiteral()
		// 否则返回空字符串
	} else {
		return ""
	}
}

// String方法用于将Program结构体转换为字符串表示
func (p *Program) StringTree() string {
	// 创建一个bytes.Buffer类型的变量out，用于存储字符串
	var out bytes.Buffer
	// 将字符串"[\n"写入out中
	out.WriteString("[\n")
	// 遍历p.Statements中的每一个元素
	for _, s := range p.Statements {
		// 将s的字符串表示写入out中
		out.WriteString(s.StringTree())
	}
	// 将字符串"]"写入out中
	out.WriteString("\n]\n")
	// 返回out的字符串表示
	return out.String()
}
